package com.scse.bms.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;


/**
 * @Title: ViewConfig
 * @Author: 吴赠禹
 * @Date: 2020/12/29 17:46
 * @Version: 1.0
 * @Description: SpringMVC自定义配置类
 */

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    /**
     * 配置拦截器
     * 1、编写一个拦截器实现HandlerInterceptor接口
     * 2、拦截器注册到容器中（实现WebMvcConfigurer的addInterceptors方法）
     * 3、指定拦截器规则（拦截所有，则静态资源也会被拦截）
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        /**
         * 默认拦截所有请求，不拦截静态资源
         */
        registry.addInterceptor(new LoginInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns("/", "/sign_in", "/login", "/login.html", "/user/login", "/theme/**", "/detail",
                        "/admin/login", "/sign_up", "/register", "/register.html", "/index", "/index.html", "/search",
                        "/feedback/add", "/feedback", "/feedback.html", "/user/register",
                        "/test/**", "/admin/theme", "/path/**", "/error", "/back/login", "/comment/listForUser",
                        "/admin-bottom", "/admin-left", "/randomCode", "/favicon.ico", "/error",
                        "/css/**", "/img/**", "/js/**", "/layui/**", "/beehive/**", "/elementui/**");

    }

    /**
     * 配置视图解析地址
     * @param registry
     */
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        // 注册页面
        registry.addViewController("/sign_up").setViewName("register");
        registry.addViewController("/register").setViewName("register");
        registry.addViewController("/register.html").setViewName("register");

        // 登录页面
        registry.addViewController("/sign_in").setViewName("login");
        registry.addViewController("/login").setViewName("login");
        registry.addViewController("/login.html").setViewName("login");

        // 后台管理相关页面
        registry.addViewController("/admin").setViewName("/admin");
        registry.addViewController("/admin-left").setViewName("/back/admin-left");
        registry.addViewController("/admin-bottom").setViewName("/back/admin-bottom");

        // 后台图表页面
        registry.addViewController("/admin/dashboard").setViewName("/back/charts");

        // 用户管理用户列表页面
        registry.addViewController("/admin/userList").setViewName("/back/userList");
        // 管理员修改用户密码页面
        registry.addViewController("/admin/userPassEdit").setViewName("/back/userPassEdit");
        // 管理员查看用户信息页面
        registry.addViewController("/admin/userInfo").setViewName("/back/userInfo");
        // 管理员上传多本电子书
        registry.addViewController("/admin/uploadMulti").setViewName("/back/book/uploadMulti");
        // 管理员上传一本电子书
        registry.addViewController("/admin/uploadSingle").setViewName("/back/book/uploadSingle");

        // 评论管理评论列表
        registry.addViewController("/admin/commentList").setViewName("/back/commentList");

        // 评论管理反馈列表
        registry.addViewController("/admin/feedbackList").setViewName("/back/feedbackList");

        // 审核清单
        registry.addViewController("/admin/checkList").setViewName("/back/checkList");

        // 图书管理图书列表页 TODO 因为需要带上数据，所以这个先注释掉
        // registry.addViewController("/admin/bookList").setViewName("/back/book/bookList");

        // 主题列表 TODO 同样注释掉，不然由于Controller中存在同样URL的GetMapping，而进不去controller方法，导致异常
        // registry.addViewController("/admin/theme").setViewName("/back/themeList");

        // 前台首页
        registry.addViewController("/index").setViewName("index");
        registry.addViewController("/index.html").setViewName("index");

        // 个人中心 TODO 需要带上数据 不能用这种方式
        // registry.addViewController("/user/self").setViewName("self");
        // registry.addViewController("/user/self.html").setViewName("self");

        // 用户反馈
        registry.addViewController("/feedback").setViewName("feedback");
        registry.addViewController("/feedback.html").setViewName("feedback");


        // 以下用于test
        registry.addViewController("/test").setViewName("/test/admin-layout");
        registry.addViewController("/test/login").setViewName("/test/login");
        registry.addViewController("/test/send").setViewName("/emailTemplate_feedback");
        registry.addViewController("/test/feedback").setViewName("feedback");



    }

    /**
     * 添加一些虚拟路径的映射
     * 静态资源路径和上传文件的路径
     *
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        /**
         * @Description: 对文件的路径进行配置, 创建一个虚拟路径/Path/** ，即只要在< img src="/Path/picName.jpg" />便可以直接引用图片
         *这是图片的物理路径  "file:/+本地图片的地址"
         */
        registry.addResourceHandler("/path/**").addResourceLocations("file:/D:/bms/book/");
    }




}
